package br.unipar.bancodedados.manager.impl;

import br.unipar.bancodedados.entidade.Categoria;
import br.unipar.bancodedados.entidade.Noticia;
import br.unipar.bancodedados.entidade.Usuario;
import br.unipar.bancodedados.manager.ConnectionSingleton;
import br.unipar.bancodedados.manager.NoticiaManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class JdbcNoticiaManagerImpl implements NoticiaManager {

    private static JdbcNoticiaManagerImpl instance;

    public static NoticiaManager getInstance() {
        if (instance == null) {
            instance = new JdbcNoticiaManagerImpl();
        }
        return instance;
    }

    private JdbcNoticiaManagerImpl() {

    }

    @Override
    public void salvar(Noticia noticia) {
        try {
            Statement stmt = ConnectionSingleton.getInstance().createStatement();

            String sql = String.format(
                    "insert into Noticia(noticia, usuario_fk, categoria_fk) values ('%s', '%s', '%s')",
                    noticia.getNoticia(), noticia.getUsuario().getId(), noticia.getCategoria().getId());
            
            stmt.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);

            ResultSet rs = stmt.getGeneratedKeys();
            rs.next();
            Long id = rs.getLong(1);
            noticia.setId(id);

            stmt.close();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public List<Noticia> listar() {
        List<Noticia> list = new ArrayList<Noticia>();

        try {
            Statement stmt = ConnectionSingleton.getInstance().createStatement();

            String sql = "select Noticia.id as 'noticiaId', Noticia.noticia as 'noticiaNoticia', "
                    + "Categoria.id as 'categoriaId', Categoria.nome as 'categoriaNome', "
                    + "Usuario.id as 'usuarioId', Usuario.login as 'usuarioLogin', Usuario.senha as 'usuarioSenha' "
                    + "from Noticia "
                    + "inner join Categoria on (Noticia.categoria_fk = Categoria.id) "
                    + "inner join Usuario on (Noticia.usuario_fk = Usuario.id)";
            ResultSet result = stmt.executeQuery(sql);

            while (result.next()) {
                Categoria categoria = new Categoria();
                categoria.setId(result.getLong("categoriaId"));
                categoria.setNome(result.getString("categoriaNome"));

                Usuario usuario = new Usuario();
                usuario.setId(result.getLong("usuarioId"));
                usuario.setLogin(result.getString("usuarioLogin"));
                usuario.setSenha(result.getString("usuarioSenha"));

                Noticia noticia = new Noticia();
                noticia.setId(result.getLong("noticiaId"));
                noticia.setNoticia(result.getString("noticiaNoticia"));
                noticia.setCategoria(categoria);
                noticia.setUsuario(usuario);

                list.add(noticia);
            }

            stmt.close();
        } catch(Exception e) {
            e.printStackTrace();
        }

        return list;
    }

    // Implementar com o Pattern Command
    // marcelo@unipar.br
    @Override
    public void salvar(Noticia noticia, Categoria categoria) {
        try {
            Statement stmt = ConnectionSingleton.getInstance().createStatement();
            try {
                stmt.execute("begin");

                String sql = String.format(
                        "insert into Categoria(nome) values ('%s')",
                        categoria.getNome());

                stmt.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);

                ResultSet rs = stmt.getGeneratedKeys();
                rs.next();
                Long id = rs.getLong(1);
                categoria.setId(id);

                noticia.setCategoria(categoria);

                sql = String.format(
                        "insert into Noticia(noticia, usuario_fk, categoria_fk) values ('%s', '%s', '%s')",
                        noticia.getNoticia(), noticia.getUsuario().getId(), noticia.getCategoria().getId());

                stmt.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);

                rs = stmt.getGeneratedKeys();
                rs.next();
                id = rs.getLong(1);
                noticia.setId(id);

                stmt.execute("commit");
            } catch (Exception e) {
                stmt.execute("rollback");
            }

            stmt.close();
        } catch (SQLException ex) {
            Logger.getLogger(JdbcNoticiaManagerImpl.class.getName()).log(Level.SEVERE, null, ex);
        }


    }

}
